package com.classtype.innerclass;

import java.lang.reflect.Constructor;

public class Outer {

	public class Inner {
		public String toString() {
			return "Hello world";
		}
	}

	public void getInner() {
		try {
			// 普通方式创建内部类实例
			System.out.println(new Outer().new Inner());// Hello world
			// !! 反射创建内部类，抛异常：java.lang.InstantiationException:Outer$Inner
			// 因为构造内部类时外部类实例不存在而抛异常。
			System.out.println(Inner.class.newInstance());
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			// 一个非静态的嵌套类的构造器，在编译的时候会将一个隐藏的参数作为它的第一个参数，这个参数表示它的直接外围实例。
			// 如果使用反射创建内部类，则要传递个隐藏参数的唯一方法就是使用java.lang.reflect.Constructor：
			Constructor c = Inner.class.getConstructor(Outer.class);// 获取带参数的内部类构造函数
			System.out.println(c.newInstance(Outer.this));// 反射时还需传进外围类
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new Outer().getInner();
	}

}
